package com.hspedu.reflection.question;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
@SuppressWarnings({"all"})
public class ReflectionQuestion {

    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //根据配置文件 re.properties 指定信息，创建Cat对象并调用方法hi
        //传统方式
        /*Cat cat = new Cat();
        cat.hi();*/

        //使用Properties读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String className = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
        //System.out.println("ClassName："+className+";MethodName:"+methodName);

        //ocp原则（开闭原则）：不修改源码的基础上扩展功能
        //使用反射机制解决
        //（1）、加载类,返回Class对象
        Class clazz = Class.forName(className);
        //（2）、创建对象
        Object o = clazz.getDeclaredConstructor().newInstance();
        //（3）、查看运行类型 class com.hspedu.Cat
        //System.out.println(o.getClass());
        //（4）、通过clazz获取加载类com.hspedu.Cat的methodName的方法对象
        Method method = clazz.getMethod(methodName);
        //（5）、调用方法
        method.invoke(o);
    }

}
//反射：通过外部文件配置，在不修改源码的基础上控制程序